package pos.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

import pos.domain.Perfil;
import pos.domain.Punto;
import pos.domain.Usuario;
import pos.utils.UIDGenerator;

public class JDBCUsuarioDAO implements IUsuarioDAO {

	public JDBCUsuarioDAO() {

	}

	public Usuario selectUsuarioByName(String nick) {

		Connection conn = ConnectionManager.getInstance().checkOut();
		System.out.println("Se ha creado la conexion correctamente");

		String sql = "SELECT * FROM usuarios WHERE (nick = ?)";
		PreparedStatement stmt = null;
		ResultSet result = null;
		Usuario usuario = new Usuario();
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setString(1, nick);
			result = stmt.executeQuery();

			if (result.next()) {

				usuario.setNombre(nick);
				usuario.setEmail(result.getString("email"));
				usuario.setFechaRegistro(result.getString("fecha_reg"));
				usuario.setPassword(result.getString("password"));
				usuario
						.setPrivilegioAdmin(result
								.getBoolean("privilegioAdmin"));
				IPuntoDAO punto = new JDBCPuntoDAO();

				usuario.setPuntos(punto.selectPuntosByUsuario(conn, usuario));

			}
		} catch (SQLException e) {
			System.out.println("Error en JDBCUsuarioDAO selectUsuarioByName");
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			ConnectionManager.getInstance().checkIn(conn);
			System.out.println("Se ha cerrado la conexi�n correctamente");
			try {
				if (result != null)
					result.close();
				if (stmt != null)
					stmt.close();
			} catch (SQLException e) {
			}

		}
		return usuario;

	}

	public String selectOIDUsuarioByName(Connection conexion, String nick) {
		String sql = "SELECT * FROM usuarios WHERE (nick = ?)";
		PreparedStatement stmt = null;
		ResultSet result = null;
		String oidUsuario = "";
		try {
			stmt = conexion.prepareStatement(sql);
			stmt.setString(1, nick);
			result = stmt.executeQuery();

			if (result.next()) {
				oidUsuario = result.getString("OID");
			}

		} catch (SQLException e) {
			System.out
					.println("Error en JDBCUsuarioDAO: selectOIDUsuarioByName");
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (result != null)
					result.close();
				if (stmt != null)
					stmt.close();
			} catch (SQLException e) {
			}

		}
		return oidUsuario;

	}

	public Usuario selectUsuarioConPerfil(String nick, String password) {
		Connection conn = ConnectionManager.getInstance().checkOut();
		System.out.println("Se ha creado la conexion correctamente");

		PreparedStatement stmt = null;
		ResultSet result = null;
		Usuario usuario = new Usuario();

		try {

			String sql = "SELECT * FROM usuarios WHERE nick=? AND password=?";

			stmt = conn.prepareStatement(sql);
			stmt.setString(1, nick);
			stmt.setString(2, password);

			result = stmt.executeQuery();
			if (result.next()) {

				usuario.setEmail(result.getString("email"));
				usuario.setNombre(result.getString("nick"));
				usuario.setPassword(result.getString("password"));
				usuario.setFechaRegistro(result.getString("fecha_reg"));

				if (result.getInt("privilegioAdmin") == 1) {
					usuario.setPrivilegioAdmin(true);
				} else {
					usuario.setPrivilegioAdmin(false);
				}
				IPerfilDAO iperfil = new JDBCPerfilDAO();
				String oid = result.getString("OID");
				usuario.setPerfil(iperfil.selectPerfilByID(conn, oid));

			}
		} catch (SQLException e) {
			System.out
					.println("Error en JDBCUsuarioDAO selectUsuarioConPerfil");
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} catch (Exception e) {

			e.printStackTrace();
		} finally {
			ConnectionManager.getInstance().checkIn(conn);
			System.out.println("Se ha cerrado la conexi�n correctamente");
			try {
				if (result != null)
					result.close();
				if (stmt != null)
					stmt.close();
			} catch (SQLException e) {
			}

		}
		return usuario;
	}

	public Usuario selectUsuarioConPerfil(String nick) {

		Connection conn = ConnectionManager.getInstance().checkOut();

		PreparedStatement stmt = null;
		ResultSet result = null;
		IUsuarioDAO iu = new JDBCUsuarioDAO();

		String OIDusuario = iu.selectOIDUsuarioByName(conn, nick);
		Usuario usuario = iu.selectUsuarioByOID(conn, OIDusuario);
		Perfil perfil = usuario.getPerfil();
		try {

			String sql =

			"SELECT * FROM usuarios u, perfiles p WHERE u.OID=p.idUsuario AND u.OID LIKE '"
					+ OIDusuario + "';";

			stmt = conn.prepareStatement(sql);
			stmt.executeQuery();
			result = stmt.executeQuery();

			if (result.next()) {

				perfil.setNombre(result.getString("nombre"));
				perfil.setApellidos(result.getString("apellidos"));
				perfil.setDirreccion(result.getString("direccion"));
				perfil.setPoblacion(result.getString("poblacion"));
				perfil.setProvincia(result.getString("provincia"));
				perfil.setDirreccion(result.getString("direccion"));

				usuario.setPerfil(perfil);

			}
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			ConnectionManager.getInstance().checkIn(conn);
			try {
				if (result != null)
					result.close();
				if (stmt != null)
					stmt.close();
			} catch (SQLException e) {
			}

		}
		return usuario;
	}

	public List<Usuario> selectAllUsuarios() {

		Connection conn = ConnectionManager.getInstance().checkOut();
		System.out.println("Se ha creado la conexion correctamente");

		PreparedStatement stmt = null;
		List<Usuario> searchResults = new LinkedList<Usuario>();
		ResultSet result = null;

		try {

			String sql = "SELECT email,nick,password,fecha_reg,cod_postal FROM usuarios ";

			stmt = conn.prepareStatement(sql);
			result = stmt.executeQuery();

			while (result.next()) {
				Usuario u = new Usuario();

				u.setEmail(result.getString("email"));
				u.setNombre(result.getString("nick"));
				u.setPassword(result.getString("password"));
				u.setFechaRegistro(result.getString("fecha_reg"));
				u.setCodigoPostal(result.getString("cod_postal"));
				searchResults.add(u);
			}
		} catch (SQLException e) {
			System.out.println("Error en JDBCUsuarioDAO selectAllUsuarios");
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (result != null)
					result.close();
				if (stmt != null)
					stmt.close();
			} catch (SQLException e) {
			}

		}
		return searchResults;

	}

	public void insertUsuario(Usuario u) {
		Connection conn = ConnectionManager.getInstance().checkOut();
		System.out.println("Se ha creado la conexion correctamente");

		PreparedStatement stmt = null;

		String sql = "INSERT INTO usuarios (OID,email,nick,password,fecha_reg,cod_postal )  VALUES (?, ?, ?, ?, ?,?) ";
		try {

			stmt = conn.prepareStatement(sql);

			stmt.setString(1, UIDGenerator.getInstance().getKey());
			stmt.setString(2, u.getEmail());
			stmt.setString(3, u.getNombre());
			stmt.setString(4, u.getPassword());
			stmt.setString(5, u.getFechaRegistro().toString());
			stmt.setString(6, u.getCodigoPostal());
			stmt.executeUpdate();

		} catch (SQLException e) {
			System.out.println("Error en JDBCUsuarioDAO insertUsuario");
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			ConnectionManager.getInstance().checkIn(conn);
			System.out.println("Se ha cerrado la conexi�n correctamente");
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}

	}

	public Usuario selectUsuarioByPunto(Connection conn, String nombrePunto,
			Double longitud, Double latitud) {
		String sql = "SELECT * FROM puntos WHERE (nombre = ?) AND (longitud = ?) AND (latitud = ?) ";
		PreparedStatement stmt = null;
		ResultSet result = null;
		Usuario usuario = new Usuario();

		try {
			stmt = conn.prepareStatement(sql);
			stmt.setString(1, nombrePunto);
			stmt.setDouble(2, longitud);
			stmt.setDouble(3, latitud);

			result = stmt.executeQuery();

			if (result.next()) {
				usuario = selectUsuarioByOID(conn, result
						.getString("idUsuario"));

			}

		} catch (SQLException e) {
			System.out.println("Error en JDBCUsuarioDAO selectUsuarioByPunto");
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (result != null)
					result.close();
				if (stmt != null)
					stmt.close();
			} catch (SQLException e) {
			}

		}
		return usuario;

	}

	public Usuario selectUsuarioByOID(Connection conexion, String OIDUsuario) {
		String sql = "SELECT * FROM usuarios WHERE (OID = ?)";
		PreparedStatement stmt = null;
		ResultSet result = null;
		Usuario usuario = new Usuario();
		try {
			stmt = conexion.prepareStatement(sql);
			stmt.setString(1, OIDUsuario);
			result = stmt.executeQuery();

			if (result.next()) {
				usuario.setPassword(result.getString("password"));
				usuario.setNombre(result.getString("nick"));
				usuario.setEmail(result.getString("email"));
				usuario.setCodigoPostal(result.getString("cod_postal"));
				usuario.setFechaRegistro(result.getString("fecha_reg"));
				usuario
						.setPrivilegioAdmin(result
								.getBoolean("privilegioAdmin"));

			}
		} catch (SQLException e) {
			System.out.println("Error en JDBCUsuarioDAO: selectUsuarioByOID");
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (result != null)
					result.close();
				if (stmt != null)
					stmt.close();
			} catch (SQLException e) {
			}

		}
		return usuario;

	}

	@Override
	public List<String> selectUsuariosAfinesAPunto(Connection conn, Punto p) {

		PreparedStatement stmt = null;
		List<String> res = new LinkedList<String>();
		ResultSet result = null;
		IPuntoDAO ip = new JDBCPuntoDAO();

		try {

			String sql = "SELECT idUsuario FROM favoritos f,ofertas o WHERE f.idOferta = o.OID AND (o.idPunto = ?) ";

			stmt = conn.prepareStatement(sql);
			stmt.setString(1, ip.selectIdPuntoByPunto(conn, p));
			result = stmt.executeQuery();
			while (result.next()) {
				res.add(result.getString("idUsuario"));
			}
		} catch (SQLException e) {
			System.out
					.println("Error en JDBCUsuarioDAO selectUsuariosAfinesAPunto");
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (result != null)
					result.close();
				if (stmt != null)
					stmt.close();
			} catch (SQLException e) {
			}

		}
		return res;

	}

}
